<?php

class DepartamentoController extends Controller {
    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'departamento';
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por DepartamentoController
     */
    public function __construct() {
        $this->departamentoService = DepartamentoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->setorService = SetorService::getInstance();
    }

    /**
     * @method  selectCaseSetores
     *
     * Realiza o gerenciamento de busca de setores com base no departamento.
     * Sera montado um select com a lista de todos os setores do departamento selecionado.
     * Se IDUsuario for passado sera pego o Setor a que ele pertence para fazer o selected.
     *
     * @since   Janeiro de 2012
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function selectCaseSetores() {
        $ArDados = $_POST;
        multipleEntities($ArDados);

        $Departamento = $this->departamentoService->findById($ArDados['IDDepartamento']);
        $Setor = false;
        if( !empty($ArDados['IDUsuario']) ) {
            $Usuario = $this->usuarioService->findById($ArDados['IDUsuario']);
            $Setor = $Usuario->getTDepartamento()->getSetores(true);
        } else if( !empty($ArDados['IDSetor']) ) {
            $Setor = $this->setorService->findById($ArDados['IDSetor']);
        }

        $this->save(SESSION_INTERFACE, 'SectorList', $Departamento->getSetores());
        $this->save(SESSION_INTERFACE, 'SectorSelected', $Setor);

        $this->view('sector_options', self::PACKAGE_VIEW, true);
    }
    /**
     * @method  listarDepartamentos
     *
     * Exbibe a listagem de todos os departamentos no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function listarDepartamentos() {
        $ArDepartaments = $this->departamentoService->findAll();
        $this->save(SESSION_INTERFACE, 'DepartamentList', $ArDepartaments);
        $this->view('listar_departamentos', self::PACKAGE_VIEW);
    }
    /**
     * @method  cadastrarDepartamento
     *
     * Chama a view de cadastro de departamento
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function cadastrarDepartamento() {
        $this->view('cadastrar', self::PACKAGE_VIEW);
    }
    /**
     * @method  inserir
     *
     * Insere o departamento no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function inserir() {
        if( empty($_POST['StDepartamento']) ) {
             $this->saveReturn('O campo "Departamento" n&atilde;o foi recebido.');
        }
        if(!$this->hasReturn()) {
            multipleEntities($_POST);
            if( $this->departamentoService->save($_POST['StDepartamento']) ) {
                $this->saveReturn('Departamento criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar Departamento.');
            }
        }
        $this->showJsonResponse();
    }
    /**
     * @method  editarDepartamento
     *
     * Chama a view de edicao de departamento com base no Id recebido na url
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function editarDepartamento() {
        $IDDepartamento = treatUrl('id');
        multipleEntities($IDDepartamento);
        $this->save(SESSION_INTERFACE, 'Departament', $this->departamentoService->findById($IDDepartamento));
        $this->view('editar', self::PACKAGE_VIEW);
    }
    /**
     * @method  atualizar
     *
     * Atualiza um usuario no sistema
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Maio de 2012
     */
    public function atualizar() {
        $ArDados = $_POST;
        if( empty($ArDados['StDepartamento']) ) {
            $this->saveReturn('O campo "Departamento" n&atilde;o foi recebido.');
        } else if( empty($ArDados['IDDepartamento']) ) {
            $this->saveReturn('Erro: O ID do Departamento não foi enviado corretamente.');
        }

        if(!$this->hasReturn()) {
            multipleEntities($ArDados);
            if( $this->departamentoService->update($ArDados) ) {
                $this->saveReturn('Departamento atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Ocorreu um erro ao atualizar o Departamento.');
            }
        }
        $this->showJsonResponse();
    }
    /**
     * @method  excluirDepartamento
     *
     * Chama a view de exclusao de departamento
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Abril de 2012
     */
    public function excluirDepartamento() {
        $IDDepartamento = treatUrl('id');
        multipleEntities($IDDepartamento);

        $Departamento = $this->departamentoService->findById($IDDepartamento);
        $DepartamentList = $this->departamentoService->findAll();

        $this->save(SESSION_INTERFACE, 'DepartamentEdit', $Departamento);
        $this->save(SESSION_INTERFACE, 'DepartamentList', $DepartamentList);

        $this->view('delete', self::PACKAGE_VIEW);
    }
    /**
     * @method  deleteDepartamento
     *
     * Realiza a exclusao do departamento no sistema de forma que se troca os seus
     * setores de departamento
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Maio de 2012
     */
    public function deleteDepartamento() {
        $ArDados = $_POST;

        if( !empty($ArDados['setor']) && count($ArDados['setor']) > 0 ) {
            foreach($ArDados['setor'] as $ArSetor) {
                if( empty($ArSetor['IDSetor']) || empty($ArSetor['IDDepartamento']) ) {
                    $this->saveReturn('Dados inconsistentes no recebimento do post para exclusão de departamento. Tente novamente.');
                }
            }
        }
        if( !$this->hasReturn() && empty($ArDados['IDDepartamento']) ) {
            $this->saveReturn('IDDepartamento não recebido.');
        }

        if( !$this->hasReturn() && !empty($ArDados['setor']) ) {
            foreach($ArDados['setor'] as $ArSetor) {
                if( !$this->setorService->changeDepartament($ArSetor['IDSetor'], $ArSetor['IDDepartamento']) ) {
                    $this->saveReturn('Ocorreu um erro ao transferir o Setor identificador por "'.$ArSetor['IDSetor'].'"');
                }
            }
        }

        if( !$this->hasReturn() ) {
            multipleEntities($ArDados);
            if( $this->departamentoService->delete($ArDados['IDDepartamento']) ) {
                    $this->saveReturn('Departamento exclu&iacute;do com sucesso. Aguarde e voc&ecirc; ser&aacute; redirecionado.', 1);
            } else {
                    $this->saveReturn('Ocorreu um erro ao deletar este departamento.');
            }
        }

        $this->showJsonResponse();
    }
    /**
     * @method  visualizarDepartamernto
     *
     * Chama a view de visualiza��o de departamento
     *
     * @author  Rafael Costa <rcosta.dev@gmail.com>
     * @since   Setembro de 2012
     */
    public function visualizarDepartamento() {
        $IDDepartamento = treatUrl('id');
        multipleEntities($IDDepartamento);
            $Departamento = $this->departamentoService->findById($IDDepartamento);
        if (empty($Departamento)) {
            return redirect('departamento', 'listar-departamentos');
        }
        $this->save(SESSION_INTERFACE, 'Department', $Departamento);
        $this->view('visualizar_departamento', self::PACKAGE_VIEW);
    }

}

?>
